package com.platform.framework.util.pub;


import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * 杂物工具类
 * @author ly-liugaoyang
 *
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
public class Utils {
	
	/**
	 * 随机数位数
	 */
	public final static Integer bit = 8;
	
    /* 
     * 返回长度为【bit】的随机数，在前面补0 
     */  
    public static String getRandomNum() {  
          
        Random rm = new Random();  
          
        // 获得随机数  
        double pross = (1 + rm.nextDouble()) * Math.pow(10, bit);  
      
        // 将获得的获得随机数转化为字符串  
        String fixLenthString = String.valueOf(pross);  
        
        SimpleDateFormat dateFormater = new SimpleDateFormat("yyyyMMddHHmmss"); // 加上时间戳
        Date date=new Date();
      
        // 返回固定的长度的随机数  
        return dateFormater.format(date) + fixLenthString.substring(2, bit + 1);  
    }  
    
    /**
     * 日期格式化工具
     * @param date
     * @param formatPattern
     * @return
     */
    public static String dateFormat (Date date,String formatPattern) {
    	SimpleDateFormat dateFormater = new SimpleDateFormat(formatPattern);
    	return dateFormater.format(date) ;
    }
    
    
    public static String getDaysInMonth (String year ,String month) {
        //输入年份，用于判断闰年！
        switch (month) {
        case "01":
        case "03":
        case "05":
        case "07":
        case "08":
        case "10":
        case "12":
        	return "31";
            //对于2月份需要判断是否为闰年
        case "02":
        	int y = Integer.parseInt(year);
            if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
            	return "29";
            } else {
            	return "28";
            }
        case "04":
        case "06":
        case "09":
        case "11":
        	return "30";
        default:
            System.out.println("请输入正确的年份和月份");
            return "";
        }
    }
    
	public static void main(String[] args) throws Exception {
		Map<String,Object> map = new HashMap<String, Object>();
		map.put("", "");
		
	}

	public static List<Date> findDates(Date dBegin, Date dEnd) {
		List lDate = new ArrayList();
		lDate.add(dBegin);
		Calendar calBegin = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		calBegin.setTime(dBegin);
		Calendar calEnd = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		calEnd.setTime(dEnd);
		// 测试此日期是否在指定日期之后
		while (dEnd.after(calBegin.getTime())) {
			// 根据日历的规则，为给定的日历字段添加或减去指定的时间量
			calBegin.add(Calendar.DAY_OF_MONTH, 1);
			lDate.add(calBegin.getTime());
		}
		return lDate;
	}

	public static List<Date> findDates(String start, String end) {
		Date dBegin = null;
		Date dEnd = null;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			dBegin = sdf.parse(start);
			dEnd = sdf.parse(end);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		List lDate = new ArrayList();

		lDate.add(dBegin);
		Calendar calBegin = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		calBegin.setTime(dBegin);
		Calendar calEnd = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		calEnd.setTime(dEnd);
		// 测试此日期是否在指定日期之后
		while (dEnd.after(calBegin.getTime())) {
			// 根据日历的规则，为给定的日历字段添加或减去指定的时间量
			calBegin.add(Calendar.DAY_OF_MONTH, 1);
			lDate.add(calBegin.getTime());
		}

		return lDate;
	}
	
	
	/**
	 * 根据属性名set属性值
	 * @param fieldName 属性名
	 * @param obj 对象
	 * @param arg 属性值
	 * @param c 属性类型
	 * @return
	 */
    public static void setFieldValueByName(String fieldName, Object obj,Object arg,Class c) {
       try {
           String firstLetter = fieldName.substring(0, 1).toUpperCase();
           String setter = "set" + firstLetter + fieldName.substring(1);
           Method method = obj.getClass().getMethod(setter, new Class[] {c});
           method.invoke(obj, new Object[] {arg});
       } catch (Exception e) {
    	   e.printStackTrace();
       }
    }
    
	/**
	 * 根据属性名get属性值
	 * @param fieldName 属性名
	 * @param obj 对象
	 * @param arg 属性值
	 * @param c 属性类型
	 * @return
	 */
    public static Object getFieldValueByName(String fieldName, Object obj) {
       try {
           String firstLetter = fieldName.substring(0, 1).toUpperCase();
           String getter = "get" + firstLetter + fieldName.substring(1);
           Method method = obj.getClass().getMethod(getter);
           return method.invoke(obj, new Object[] {});
       } catch (Exception e) {
    	   e.printStackTrace();
    	   return null;
       }
    }
    
}
